10905. Детская игра
Игрок имеет n положительных чисел. Склеивая их
друг с другом, можно получить разные длинные числа. Например, из чисел 123,
124, 56, 90 можно получить 24 разных числа: 1231245690, 1241235690, 5612312490,
9012312456, 9056124123 и так далее. Число 9056124123 является наибольшим среди
них.
Для заданного набора чисел
следует найти максимальное число, которое можно получить в результате склейки.
Вход. Первая
строка каждого теста содержит количество положительных чисел n (n £ 50). Во второй строке следуют сами n чисел. Последний тест содержит n = 0 и не обрабатывается.
Выход. Для каждого теста вывести
наибольшее положительное число, которое можно получить в результате склейки чисел.
3
123 127 1239
4
123 124 56 90
5
123 124 56 90 9
5
9 9 9 9 9
0
Пример выхода
9056124123
99056124123
99999
РЕШЕНИЕ
сортировка
Занесем входные числа в массив
строк. Отсортируем строки согласно правилу: строка a меньше строки b тогда и только тогда, когда строка a + b меньше строки b + a
(‘+’ – операция
конкатенации строк). Строки сортируются по убыванию.
Рассмотрим первый тест.
Последовательность обменов чисел при сортировке имеет вид:
123 |
127 |
1239 |
123127 < 127123 |
127 |
123 |
1239 |
1231239 < 1239123 |
127 |
1239 |
123 |
конец |
В символьный массив m будем
считывать очередное входное число, преобразовывать в тип string и заносить в s[i]. Все входные числа храним в
массиве строк s.
char m[100];
string s[100];
Функция сравнения строк f имеет
вид:
int f(string a, string b)
{
return a + b
> b + a;
}
Основной цикл программы. Заносим
входные слова в строковый массив s.
while(scanf("%d",&n),n)
{
for(i = 0; i
< n; i++)
{
scanf("%s",m);
s[i] = string(m);
}
Сортируем строки согласно функции
сортировки f.
sort(s,s+n,f);
Последовательно выводим
отсортированные строки. Получим наибольшее число, которое можно получить из
исходных в результате склейки.
for(i = 0; i <
n; i++) printf("%s",s[i].c_str());
printf("\n");
}